import axios from 'axios'
const baseURL = 'http://124.220.108.74/api'
/**
 * axios api的使用:
 * 1. axios(config)
 * 2. axios(url,config)
 * ----------------------\
 * config的属性：
 * headers：定义请求头
 * url：定义相对路径
 * baseURL：定义基准路径
 * method: 定义响应方法
 * data:定义post请求数据
 * params：定义params请求数据
 * responseType：定义返回数据类型
 * 本封装使用第2种方式
 */
//1.创建axios实例instance,同时可以预定义config参数，实例创建后，还可以定义config参数，axios会把二者进行合并
const instance = axios.create({
  baseURL: baseURL,
  timeout: 1000,
})
//2. 请求拦截器
instance.interceptors.request.use(
  //拦截，
  //失败
  (config) => {
    //1. 根据url判断是否使用baseURL
    if (!config.url.toString().startsWith('http')) {
      config.url = config.baseURL + config.url
    } //2.根据type来决定使用json格式的数据还是form数据
    const { type = 'form' } = config
    let headers = {}
    if (type === 'json') {
      headers = { 'Content-Type': 'application/json' }
    } else {
      headers = {
        'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8',
      }
    }
    //如果localStorage.getItem("token")不为空，增加header选项
    if (config.token) {
      headers = {
        Authorization: config.token,
        ...headers,
      }
    }
    config.headers = {
      ...config.headers,
      ...headers,
    }

    return config
  },
  (error) => {
    return Promise.reject(new Error(`请求错误:${error.message}`))
  },
)
//3. 响应拦截器
instance.interceptors.response.use(
  //拦截
  /**
   *
   * @param {*} response{data,status,statusText,headers,config,requestd}
   * @returns response.data
   */
  (response) => {
    return response.data
  },
  //失败
  (error) => {
    const { response } = error
    const errorMessage = response
      ? `请求错误:${response.status}${response.statusText}`
      : `网络错误:${error.message}`
    return Promise.reject(new Error(errorMessage))
  },
)

export default instance
